package com.itheima.d2_recursion;

/**
 * 目标：掌握递归的应用，执行流程和算法思想。
 *
 * 需求：计算n的阶乘，5的阶乘=1*2*3*4*5;  6的阶乘=1*2*3*4*5*6；
 * 分析
 * 假如我们认为存在一个公式是 f(n) = 1*2*3*4*5*6*7*…(n-1)*n;
 * 那么公式等价形式就是： f(n) = f(n-1) *n
 * 如果求的是 1-5的阶乘 的结果，我们手工应该应该如何应用上述公式计算。
 * f(5) =  f(4) * 5
 * f(4) =  f(3) * 4
 * f(3) =  f(2) * 3
 * f(2) =  f(1) * 2
 * f(1) =  1
 *
 *  递归求阶乘的执行流程：
 *
 *  然后就是把返回的1代入f(1)得到f（2），然后代入f（2）得到f（3）等等
 *
 *  第五次是最后一次调用f方法，返回1
 *
 *第五次调用f方法进入栈内存：
 * 方法：f
 * 参数：n = 1
 * 返回：1
 *
 *第四次调用f方法进入栈内存：
 *方法：f
 * 参数：n = 2
 * 返回：2 * f(1)
 *
 *第三次调用f方法进入栈内存：
 *方法：f
 * 参数：n = 3
 * 返回：3 * f(2)
 *
 *  第二次调用f方法进入栈内存：
 *  方法：f
 * 参数：n = 4
 * 返回：4 * f(3)
 *
 * 第一次调用f方法进入栈内存：
 * 方法：f
 * 参数：n = 5
 * 返回：5 * f(4)
 *
 * 首先是方法：main先进入栈内存
 *
 *递归算法三要素：
 * 递归的公式： f(n) =  f(n-1) * n;
 * 递归的终结点：f(1)
 * 递归的方向必须走向终结点：
 * f(5) =  f(4) * 5
 * f(4) =  f(3) * 4
 * f(3) =  f(2) *3
 * f(2) =  f(1) *2
 * f(1) =  1
 *
 */
public class RecursionTest2 {
    public static void main(String[] args) {
        System.out.println("5的阶乘是：" + f(5));
    }

    public static int f(int n){
        // 终结点
        if(n == 1){
            return 1;
        }else {
            return f(n - 1) * n;
        }
    }
}
